// ----------------------------------
// RSDK Project: Sonic Essence
// Script Description: Egg Fighter
// Script Author: Tails LP
// ----------------------------------

//-------Aliases-------//

private alias object.value0 : frame.timer
private alias object.value1 : walk.timer
private alias object.value2 : turn.timer
private alias object.value3 : shoot.timer
private alias object.value4 : bullet.timer
private alias object.value5 : shoot.cooldown

private alias object.value8 : health	//every enemy should use Value8 as it's health value, 'cause it'll be set in PlayerObject.txt
private alias object.value9 : cooldown	//same here


private alias object.value40 : player.hitboxLeft
private alias object.value38 : player.hitboxTop
private alias object.value41 : player.hitboxRight
private alias object.value39 : player.hitboxBottom

private alias 0 : SONIC
private alias 1 : SHADOW

//Property Value

private alias 0 : UNARMED
private alias 1 : SHOOTER
private alias 2 : KNIGHT

private alias 0 : INITIATE
private alias 1 : IDLE
private alias 2 : WALK
private alias 3 : ATTACK
private alias 4 : BREAK
private alias 5 : TURN
private alias 6 : SHOOT
private alias 7 : TURNANDSHOOT


//-------Tables-------//


//-------Functions-------//
reserve function EggFighter_DebugDraw
reserve function EggFighter_DebugSpawn

function EggFighter_DebugDraw
	DrawSprite(0)
end function


function EggFighter_DebugSpawn
	CreateTempObject(TypeName[EggFighter], 0, object.xpos, object.ypos)
	object[tempObjectPos].drawOrder = 4
end function

// TODO:

// fit movement to animation
// tweek walking phase

event ObjectMain
		object.priority = PRIORITY_ACTIVE
			if object.direction > 0
				ObjectTileGrip(CSIDE_FLOOR, -18, 26, PATH_A)
			else
				ObjectTileGrip(CSIDE_FLOOR, 18, 26, PATH_A)
			end if
			if checkResult == false
				object.state = TURN
			endif
			ObjectTileGrip(CSIDE_FLOOR, 0, 26, PATH_A)


	switch object.state
	case INITIATE
		CreateTempObject(TypeName[Health Bar], 0, object.xpos, object.ypos)
		object[tempObjectPos].value0 = object.entityPos

		switch stage.playerListPos
		case SONIC
			health = 0 // does the same as 1, but doesn't spawn a healthbar.
			break
		case SHADOW
			health = 4 // breaks after 4 hits
			break
		endswitch
		object.state = IDLE
		cooldown = 0
		break
	case IDLE
		walk.timer = 240
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if object[currentPlayer].xpos < object.xpos
				object.direction = FLIP_X
				if object.propertyValue == SHOOTER
					BoxCollisionTest(C_TOUCH, object.entityPos, -158, -256, 0, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
				else
					BoxCollisionTest(C_TOUCH, object.entityPos, -128, -256, 0, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
				end if
				if checkresult == 1
					if object.propertyValue == SHOOTER
						object.state = ATTACK
					else
						object.state = WALK
					endif
					frame.timer = 0
				endif
			else
				object.direction = FLIP_NONE
				if object.propertyValue == SHOOTER
					BoxCollisionTest(C_TOUCH, object.entityPos, 0, -256, 158, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
				else
					BoxCollisionTest(C_TOUCH, object.entityPos, 0, -256, 128, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
				end if
				
				if checkresult == 1
					if object.propertyValue == SHOOTER
						object.state = ATTACK
					else
						object.state = WALK
					endif
					frame.timer = 0
				endif
			endif
			
		next
		break
	case WALK
		if object.direction == FLIP_X
			walk.timer --
		else
			walk.timer ++
		endif

		if walk.timer > 480
			walk.timer = 480
			object.state = TURN
		endif
		if walk.timer < 0
			walk.timer = 0
			object.state = TURN
		endif

		if object.direction == FLIP_X
			object.xpos += -0x5000
		else
			object.xpos += 0x5000
		endif

		shoot.cooldown --

		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if shoot.cooldown <= 0
				if object[currentPlayer].xpos < object.xpos
					if object.propertyValue == SHOOTER
						BoxCollisionTest(C_TOUCH, object.entityPos, -158, -256, 0, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
					else
						BoxCollisionTest(C_TOUCH, object.entityPos, -46, -256, -20, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
					endif
					if checkresult == 1
						object.direction = FLIP_X
						object.state = ATTACK
						frame.timer = 0
					endif
				else
					if object.propertyValue == SHOOTER
						BoxCollisionTest(C_TOUCH, object.entityPos, 0, -256, 158, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
					else
						BoxCollisionTest(C_TOUCH, object.entityPos, 20, -256, 46, 256, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
					endif
					if checkresult == 1
						object.direction = FLIP_NONE
						object.state = ATTACK
						frame.timer = 0
					endif
				endif
			endif
			
		next
		break
	case ATTACK
			
			foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)

			if object[currentPlayer].xpos < object.xpos
				object.direction = FLIP_X
			else
				object.direction = FLIP_NONE
			endif

			if object.propertyValue != SHOOTER
				switch object.frame
				case 13
					if object.direction == FLIP_X
						BoxCollisionTest(C_TOUCH, object.entityPos, 30, -25, 40, -15, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					else
						BoxCollisionTest(C_TOUCH, object.entityPos, -40, -25, -30, -15, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					endif
					temp0 = checkResult

					if temp0 == 1
						CallFunction(PlayerObject_BadnikHit)
					end if
					break
				case 14
					if object.direction == FLIP_X
						BoxCollisionTest(C_TOUCH, object.entityPos, -50, 0, -40, 10, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					else
						BoxCollisionTest(C_TOUCH, object.entityPos, 40, 0, 50, 10, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					endif
					temp0 = checkResult

					if temp0 == 1
						CallFunction(PlayerObject_BadnikHit)
					end if
					break
				endswitch
			endif

			next
		break

	case SHOOT
		shoot.timer ++
		if shoot.timer >= 40
			shoot.timer = 0
			object.state = WALK
			shoot.cooldown = 140
		endif
		
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)

			if object[currentPlayer].xpos < object.xpos
				object.direction = FLIP_X
			else
				object.direction = FLIP_NONE
			endif
		next

		if frame.timer == 0
			switch object.direction
			case FLIP_NONE
				temp0 = object.xpos
				temp0 += 0x200000
				temp1 = object.ypos
				temp1 += 0x20000
				CreateTempObject(TypeName[Egg Fighter Bullet], 0, temp0, temp1)
				object[tempObjectPos].xvel = 0x30000
				temp0 -= 0x280000
				temp1 = object.ypos
				temp1 += 0x30000
				CreateTempObject(TypeName[Egg Fighter Bullet], 0, temp0, temp1)
				object[tempObjectPos].xvel = 0x30000
				break
			case FLIP_X
				temp0 = object.xpos
				temp1 = object.ypos
				temp1 += 0x20000
				CreateTempObject(TypeName[Egg Fighter Bullet], 0, temp0, temp1)
				object[tempObjectPos].xvel = -0x30000
				temp0 -= 0x280000
				temp1 += 0x30000
				CreateTempObject(TypeName[Egg Fighter Bullet], 0, temp0, temp1)
				object[tempObjectPos].xvel = -0x30000
				break
			endswitch
		endif
		break

	case TURNANDSHOOT
		turn.timer ++
		switch turn.timer
		case 12
			object.direction ^= 1
			break
		case 24
			object.state = WALK
			turn.timer = 0
			break
		endswitch
		break

	case TURN
		turn.timer ++
		switch turn.timer
		case 12
			object.direction ^= 1
			break
		case 24
			object.state = WALK
			turn.timer = 0
			break
		endswitch
		break
	endswitch

		switch stage.playerListPos
		case SONIC
		case SHADOW
			foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
				if cooldown <= 0
					BoxCollisionTest(C_TOUCH, object.entityPos, -18, -18, 18, 18, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)
					if checkResult == 1
						CallFunction(PlayerObject_BadnikBreak)
						cooldown = 20
					end if
				else
					cooldown --
				endif
			next
			break
		endswitch
end event

event ObjectDraw	
	switch object.state
	case IDLE
		frame.timer ++
		if frame.timer > 9
			frame.timer = 0
			object.frame ++
			if object.frame > 2
				object.frame = 0
			endif
		endif
		break
	case WALK
		frame.timer ++
		if frame.timer > 9
			frame.timer = 0
			object.frame ++
			if object.frame > 10
				object.frame = 3
			endif
			if object.frame < 3
				object.frame = 3
			endif
		endif
		break
	case ATTACK
		frame.timer ++

		switch object.propertyValue
		case UNARMED
			if frame.timer > 7
				frame.timer = 0
				object.frame ++
				if object.frame > 17
					object.frame = 12
					object.state = WALK
				endif
				if object.frame < 12
					object.frame = 12
				endif
			endif
			break

		case SHOOTER
			if frame.timer > 7
				frame.timer = 0
				object.frame ++
				if object.frame > 18
					object.frame = 19
					object.state = SHOOT
				endif
				if object.frame < 12
					object.frame = 12
				endif
			endif
			break
		endswitch

		break

	case SHOOT
		frame.timer ++
		if frame.timer > 7
			frame.timer = 0
			object.frame ++
			if object.frame > 20
				object.frame = 19
			endif
			if object.frame < 19
				object.frame = 19
			endif
		endif
		break

	case TURN
		object.frame = 11
		break
	endswitch

	switch object.propertyvalue

	case UNARMED
		temp5 = 0
		break
	case SHOOTER
		temp5 = 18
		break
	case KNIGHT
		temp5 = 0
		break
	endswitch

	temp5 += object.frame
	DrawSpriteFX(temp5, FX_FLIP, object.xpos, object.ypos)
end event

event ObjectStartup
    	LoadSpriteSheet("WIZ/Objects.gif")

//---------------UNARMED----------------------

		//idle

		SpriteFrame(-25, -27, 51, 54, 1, 1)		// 0 Idle #1
		SpriteFrame(-26, -26, 52, 53, 53, 1)		// 1 Idle #2
		SpriteFrame(-25, -26, 51, 53, 106, 1)		// 2 Idle #3

		//walking

		SpriteFrame(-25, -27, 51, 54, 158, 1)		// 3 Walking #1
		SpriteFrame(-23, -26, 49, 53, 210, 1)		// 4 Walking #2
		SpriteFrame(-23, -27, 49, 54, 260, 1)		// 5 Walking #3
		SpriteFrame(-25, -28, 51, 55, 310, 1)		// 6 Walking #4
		SpriteFrame(-26, -27, 52, 54, 362, 1)		// 7 Walking #5
		SpriteFrame(-27, -26, 53, 53, 415, 1)		// 8 Walking #6
		SpriteFrame(-25, -26, 51, 53, 1, 56)		// 9 Walking #7
		SpriteFrame(-24, -27, 50, 54, 53, 56)		// 10 Walking #8
		SpriteFrame(-23, -27, 49, 54, 435, 55)		// 11 Turning Frame

		//attack

		SpriteFrame(-25, -27, 51, 54, 1, 1)		// 12 Idle #1
		SpriteFrame(-33, -27, 59, 54, 104, 56)		// 13 Attack #1
		SpriteFrame(-48, -33, 73, 60, 164, 56)		// 14 Attack #2
		SpriteFrame(-25, -26, 83, 53, 238, 57)		// 15 Attack #3
		SpriteFrame(-16, -25, 63, 52, 322, 57)		// 16 Attack #4
		SpriteFrame(-16, -26, 48, 53, 386, 56)		// 17 Attack #5

//---------------SHOOTER----------------------

		//idle

		SpriteFrame(-25, -27, 51, 54, 1, 117)		// 18 Idle #1
		SpriteFrame(-26, -26, 52, 53, 53, 117)		// 19 Idle #2
		SpriteFrame(-25, -26, 51, 53, 106, 117)		// 20 Idle #3

		//walking

		SpriteFrame(-25, -27, 51, 54, 158, 117)		// 21 Walking #1
		SpriteFrame(-23, -26, 49, 53, 210, 117)		// 22 Walking #2
		SpriteFrame(-23, -27, 49, 54, 260, 117)		// 23 Walking #3
		SpriteFrame(-25, -28, 51, 55, 310, 117)		// 24 Walking #4
		SpriteFrame(-26, -27, 52, 54, 362, 117)		// 25 Walking #5
		SpriteFrame(-27, -26, 53, 53, 415, 117)		// 26 Walking #6
		SpriteFrame(-25, -26, 51, 53, 1, 172)		// 27 Walking #7
		SpriteFrame(-24, -27, 50, 54, 53, 172)		// 28 Walking #8
		SpriteFrame(-23, -27, 49, 54, 456, 173)		// 29 Turning Frame

		//attack

		SpriteFrame(-25, -27, 51, 54, 1, 117)		// 30 Idle #1
		SpriteFrame(-28, -25, 57, 52, 104, 181)		// 31 Attack #1
		SpriteFrame(-29, -22, 60, 49, 162, 184)		// 32 Attack #2
		SpriteFrame(-24, -28, 51, 55, 223, 178)		// 33 Attack #3
		SpriteFrame(-19, -33, 59, 60, 275, 173)		// 34 Attack #4
		SpriteFrame(-21, -33, 61, 60, 335, 173)		// 35 Attack #5
		SpriteFrame(-19, -20, 58, 47, 397, 173)		// 36 Attack #6

		SpriteFrame(-19, -22, 58, 49, 1, 234)		// 37 Attack #7
		SpriteFrame(-19, -22, 58, 49, 60, 234)		// 38 Attack #8

		SpriteFrame(-22, -25, 56, 52, 119, 234)		// 39 Attack #9

		SpriteFrame(-23, -22, 44, 49, 176, 234)		// 40 Shooting Turning Frame

		

	SetTableValue(TypeName[EggFighter], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(EggFighter_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(EggFighter_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
	DebugMode_ObjCount++
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 223, 172)
end event